﻿#define _CRT_SECURE_NO_WARNINGS 1

#include <stdio.h>


// static 修饰局部变量
// 
//static修饰局部变量改变了变量的生命周期，生命周期改变的本质是改变了变量的储存类型，
//本来一个局部变量是存储在栈区的，但被static修饰后存储在静态区。
//存储在静态区的变量和全局变量一样的，生命周期和程序的生命周期一样了，
//只有程序结束，变量才销毁，内存才回收。但是作用域不变

//void test()
//{
//	//static 修饰局部变量
//	static int i = 0;
//	i++;
//	printf("%d ", i);
//}
//
//int main()
//{
//	int i = 0;
//	for (i = 0; i < 5; i++)
//	{
//		test();
//	}
//	return 0;
//}



//static 修饰全局变量

//⼀个全局变量被static修饰，使得这个全局变量只能在本源⽂件内使⽤，不能在其他源⽂件内使⽤。
//本质原因是全局变量默认是具有外部链接属性的，在外部的⽂件中想使⽤，只要适当的声明就可以使
//⽤；但是全局变量被static修饰之后，外部链接属性就变成了内部链接属性，只能在⾃⼰所在的源
//⽂件内部使⽤了，其他源⽂件，即使声明了，也是⽆法正常使⽤的。


// extern 是⽤来声明外部符号的，如果⼀个全局的符号在A⽂件中定义的，在B⽂件中想使⽤，
// 就可以使用extern进行声明，然后使用。

//extern int g_val;
//int main()
//{
//	printf("%d\n", g_val);
//	return 0;
//}



//static 修饰函数

//其实static修饰函数和static修饰全局变量是⼀模⼀样的，⼀个函数在整个⼯程都可以使⽤，
//被static修饰后，只能在本⽂件内部使⽤，其他⽂件⽆法正常的链接使⽤了。
//本质是因为函数默认是具有外部链接属性，具有外部链接属性，使得函数在整个⼯程中只要适当的声
//明就可以被使⽤。但是被static修饰后变成了内部链接属性，使得函数只能在⾃⼰所在源⽂件内部使⽤

//extern int Add(int x, int y);
//int main()
//{
//	printf("%d\n", Add(2, 3));
//	return 0;
//}

